/**
 * Java 逻辑运算符练习类
 * 逻辑运算符用于判断布尔值（true/false）之间的关系，返回结果仍为布尔值
 * 核心运算符：&&（逻辑与）、||（逻辑或）、!（逻辑非）
 */
public class LogicalOperatorDemo {
    public static void main(String[] args) {
        // 1. 定义测试用的布尔变量（模拟实际场景中的条件，如“年龄是否成年”“是否会员”）
        boolean isAdult = true;    // 年龄是否成年（true=成年，false=未成年）
        boolean isVip = false;     // 是否为会员（true=会员，false=非会员）
        int score = 85;            // 考试分数（用于结合数值判断条件）


        // 2. 逻辑与（&&）：两个条件【都为true】时，结果才为true；只要一个为false，结果为false
        // 场景：“成年 且 是会员”才能享受专属折扣
        boolean canGetVipDiscount = isAdult && isVip;
        System.out.println("1. 逻辑与（&&）示例：");
        System.out.println("是否成年：" + isAdult);
        System.out.println("是否会员：" + isVip);
        System.out.println("能否享受会员折扣（成年且会员）：" + canGetVipDiscount); // 结果：false（因isVip为false）
        System.out.println("----------------------------------------");


        // 3. 逻辑或（||）：两个条件【至少一个为true】时，结果为true；两个都为false，结果才为false
        // 场景：“成年 或 分数≥80”可参与抽奖
        boolean canJoinLottery = isAdult || (score >= 80);
        System.out.println("2. 逻辑或（||）示例：");
        System.out.println("是否成年：" + isAdult);
        System.out.println("分数是否≥80：" + (score >= 80)); // 先计算括号内的数值判断，再参与逻辑运算
        System.out.println("能否参与抽奖（成年或分数≥80）：" + canJoinLottery); // 结果：true（因isAdult为true）
        System.out.println("----------------------------------------");


        // 4. 逻辑非（!）：对单个条件取反（true变false，false变true）
        // 场景：“非未成年”即成年，“非会员”即普通用户
        boolean isNotMinor = !(!isAdult); // 双重非：先取反isAdult（true→false），再取反（false→true）
        boolean isNormalUser = !isVip;    // 取反isVip（false→true）
        System.out.println("3. 逻辑非（!）示例：");
        System.out.println("是否未成年（!isAdult）：" + !isAdult); // 结果：false
        System.out.println("双重非验证成年（!!isAdult）：" + isNotMinor); // 结果：true
        System.out.println("是否为普通用户（!isVip）：" + isNormalUser); // 结果：true
        System.out.println("----------------------------------------");


        // 5. 短路特性（逻辑运算符的重要优化）：
        // - &&：若第一个条件为false，直接返回false，不再判断第二个条件（“短路”第二个条件）
        // - ||：若第一个条件为true，直接返回true，不再判断第二个条件（“短路”第二个条件）
        System.out.println("4. 短路特性示例：");
        int num = 10;
        // 逻辑与短路：第一个条件（num < 5）为false，第二个条件（num++ > 0）不会执行，num仍为10
        boolean shortCircuitAnd = (num < 5) && (num++ > 0);
        System.out.println("逻辑与短路后，num的值：" + num); // 结果：10（num++未执行）

        // 逻辑或短路：第一个条件（num > 5）为true，第二个条件（num-- < 20）不会执行，num仍为10
        boolean shortCircuitOr = (num > 5) || (num-- < 20);
        System.out.println("逻辑或短路后，num的值：" + num); // 结果：10（num--未执行）
    }
}